Decomposition of potato yield gap in the Andean north of Peru

A crop modeling approach

Background

This repository is designed to provide comprehensive documentation of the R code used for the analysis of yield gap decomposition, integrating both crop modeling and stochastic frontier analysis.

Libraries and extra R-files

The following libraries were used:

# libraries
library(nasapower)
library(meteor)
library(lubridate)
library(dplyr)

Additionally, extra R-files need to be loaded.

# extra R-files
load(url("https://github.com/jninanya/solanumR/raw/refs/heads/main/CropParamsList.Rdata"))
source("https://raw.githubusercontent.com/jninanya/solanumR/refs/heads/main/thermalTime.R")
source("https://raw.githubusercontent.com/jninanya/solanumR/refs/heads/main/SolanumModel.R")

Field experiment and data collection

A field experiment was conducted to determine the potential yield of the five most commonly grown potato varieties in Chugay, La Libertad, Peru: Amarillis, Bretaña, Huevo de Indio, Poderosa, and Yungay. These varieties were managed under optimal growing conditions to assess their yield potential. The trial took place from 24th October 2023 to 18th April 2024, providing insights into how these varieties perform in a local context under “ideal” conditions.

Figura 1: Field experiment to determine potential yield of the most common potato varieties in Chugay Distric, La-Libertad region, Peru.
Figura 1: Field experiment to determine potential yield of the most common potato varieties in Chugay Distric, La-Libertad region, Peru.

A total of five biomass evaluations were carried out, where the plant organs (leaf, stem, root, and tubers) were separated, every two weeks from the tuberization stage to harvest. Additionally, fifteen canopy cover evaluations were conducted from plant emergence to senescence, providing detailed data on the growth and development of the five potato varieties. The dataset related to this field experiment can be downloaded at https://doi.org/10.21223/JPA3NZ.

Biomass data

Lets see the harvest index, i.e., the ratio of tuber biomass over total biomass. Click on code to see the R chunk code for the canopy biomass data.

#---------------------------------------------------------------
# SUMMARY OF BIOMASS DATA
#---------------------------------------------------------------
BD <- read.csv("https://github.com/jninanya/Potato_Yield_Gap/raw/refs/heads/main/Data/biomass_dataset.csv")
#head(BD)

# Constant to convert kg/plant to t/ha
k = (1/1000)*(1/(0.3*1))*(10000/1)*0.001

# Matter concentration of <organ> (MCX)
BD$MCL <- BD$sDLM/BD$sFLM      # L = leaf
BD$MCS <- BD$sDSM/BD$sFSM      # S = stem
BD$MCR <- BD$sDRM/BD$sFRM      # R = root
BD$MCT <- BD$sDTM/BD$sFTM      # T = tuber
BD$DMC <- BD$MCT                 

# Dry <organ> matter (DXM)
BD$DLM <- BD$FLM*BD$MCL
BD$DSM <- BD$FSM*BD$MCS
BD$DRM <- BD$FRM*BD$MCR
BD$DTM <- BD$FTM*BD$MCT

# Fresh <organ> yield (FXY)
BD$FLY <- BD$FLM*k
BD$FSY <- BD$FSM*k
BD$FRY <- BD$FRM*k
BD$FTY <- BD$FTM*k               

# Dry <organ> yield (DXY)
BD$DLY <- BD$DLM*k
BD$DSY <- BD$DSM*k
BD$DRY <- BD$DRM*k
BD$DTY <- BD$DTM*k

# Total dry matter (TDM) and harvest index (HI)
BD$TDM <- BD$DLY + BD$DSY + BD$DRY + BD$DTY
BD$HI <- BD$DTY/BD$TDM

# Summary: mean and standard error for HI
smrBD <- BD %>%
  group_by(CODE, EVAL, DAP) %>%
  summarise(DLY = mean(DLY, na.rm = TRUE),
            DSY = mean(DSY, na.rm = TRUE),
            DRY = mean(DRY, na.rm = TRUE),
            DTY = mean(DTY, na.rm = TRUE),
            FTY = mean(FTY, na.rm = TRUE),
            TDM = mean(TDM, na.rm = TRUE),
            DMC = mean(DMC, na.rm = TRUE),
            N = sum(!is.na(HI)),
            nd = n(),
            HI_mean = mean(HI, na.rm = TRUE),
            HI_se = sd(HI, na.rm = TRUE)/sqrt(N)
    )
smrBD <- as.data.frame(smrBD)

# Data frame for each variety
AMA <- smrBD[smrBD$CODE=="AMA",]
BRE <- smrBD[smrBD$CODE=="BRE",]
HUE <- smrBD[smrBD$CODE=="HUE",]
POD <- smrBD[smrBD$CODE=="POD",]
YUN <- smrBD[smrBD$CODE=="YUN",]

# General plot settings
par(oma    = c(4.5, 4.5, 0.5, 3),  # general margins
    mfrow  = c(1, 5),                # number of sub-figures
    mar    = c(0, 0, 0, 0),          # margins per sub-figure
    family = "serif",                # text family
    lwd    = 1.0,                    # line width
    las    = 1,                      # style of axis labels  
    pch    = 19,                     # plotting points
    cex    = 0.8
)

# Color and y-axis limits
pC <- c("blue","yellow","green","cyan","red") 
yL <- c(0,1) 

# Plot for Amarilis
with(AMA, plot(x=DAP, y=HI_mean, ylim=yL, col=pC[1], axes=FALSE, xlab="", ylab=""))
with(AMA, lines(x=DAP, y=HI_mean, lty=2, col=pC[1]))
box(); axis(2); axis(4, labels=FALSE);axis(1)
mtext(side=2, "Harvest Index", line=3, las=0)

# Plot for Bretana
with(BRE, plot(x=DAP, y=HI_mean, ylim=yL, col=pC[2], axes=FALSE, xlab="", ylab=""))
with(BRE, lines(x=DAP, y=HI_mean, lty=2, col=pC[2]))
box(); axis(2,labels=FALSE); axis(4, labels=FALSE);axis(1)

# Plot for Huevo de Indio
with(HUE, plot(x=DAP, y=HI_mean, ylim=yL, col=pC[3], axes=FALSE, xlab="", ylab=""))
with(HUE, lines(x=DAP, y=HI_mean, lty=2, col=pC[3]))
box(); axis(2,labels=FALSE); axis(4, labels=FALSE);axis(1)
mtext(side=1, "Days after planting", line=3)

# Plot for Poderosa
with(POD, plot(x=DAP, y=HI_mean, ylim=yL, col=pC[4], axes=FALSE, xlab="", ylab=""))
with(POD, lines(x=DAP, y=HI_mean, lty=2, col=pC[4]))
box(); axis(2,labels=FALSE); axis(4, labels=FALSE);axis(1)

# Plot for Yungay
with(YUN, plot(x=DAP, y=HI_mean, ylim=yL, col=pC[5], axes=FALSE, xlab="", ylab=""))
with(YUN, lines(x=DAP, y=HI_mean, lty=2, col=pC[5]))
box(); axis(2,labels=FALSE); axis(4);axis(1)

Canopy cover data

Click on code to see the R chunk code for the canopy cover data.

#---------------------------------------------------------------
# SUMMARY OF CANOPY COVER DATA
#---------------------------------------------------------------
CD <- read.csv("https://github.com/jninanya/Potato_Yield_Gap/raw/refs/heads/main/Data/canopy_cover_dataset.csv")
#head(CD)

# Summary by variety and evaluation
smrCD <- CD %>%
  group_by(CODE, DAP) %>%
  summarise(N = sum(!is.na(CC)),
            nd = n(),
            CC_mean = mean(CC, na.rm = TRUE),
            CC_se = sd(CC, na.rm = TRUE)/sqrt(N),
  )

smrCD <- as.data.frame(smrCD)

# Data frame for each variety
AMA <- smrCD[smrCD$CODE=="AMA",]
BRE <- smrCD[smrCD$CODE=="BRE",]
HUE <- smrCD[smrCD$CODE=="HUE",]
POD <- smrCD[smrCD$CODE=="POD",]
YUN <- smrCD[smrCD$CODE=="YUN",]

# General plot settings
par(oma    = c(4.5, 4.5, 0.5, 3),  # general margins
    mfrow  = c(1, 5),                # number of sub-figures
    mar    = c(0, 0, 0, 0),          # margins per sub-figure
    family = "serif",                # text family
    lwd    = 1.0,                    # line width
    las    = 1,                      # style of axis labels  
    pch    = 19,                     # plotting points
    cex    = 0.8
)

# Color and y-axis limits
pC <- c("blue","yellow","green","cyan","red") 
yL <- c(0,100) 

# Plot for Amarilis
with(AMA, plot(x=DAP, y=CC_mean, ylim=yL, col=pC[1], axes=FALSE, xlab="", ylab=""))
with(AMA, lines(x=DAP, y=CC_mean, lty=2, col=pC[1]))
box(); axis(2); axis(4, labels=FALSE);axis(1)
mtext(side=2, "Canopy cover (%)", line=3, las=0)

# Plot for Bretana
with(BRE, plot(x=DAP, y=CC_mean, ylim=yL, col=pC[2], axes=FALSE, xlab="", ylab=""))
with(BRE, lines(x=DAP, y=CC_mean, lty=2, col=pC[2]))
box(); axis(2,labels=FALSE); axis(4, labels=FALSE);axis(1)

# Plot for Huevo de Indio
with(HUE, plot(x=DAP, y=CC_mean, ylim=yL, col=pC[3], axes=FALSE, xlab="", ylab=""))
with(HUE, lines(x=DAP, y=CC_mean, lty=2, col=pC[3]))
box(); axis(2,labels=FALSE); axis(4, labels=FALSE);axis(1)
mtext(side=1, "Days after planting", line=3)

# Plot for Poderosa
with(POD, plot(x=DAP, y=CC_mean, ylim=yL, col=pC[4], axes=FALSE, xlab="", ylab=""))
with(POD, lines(x=DAP, y=CC_mean, lty=2, col=pC[4]))
box(); axis(2,labels=FALSE); axis(4, labels=FALSE);axis(1)

# Plot for Yungay
with(YUN, plot(x=DAP, y=CC_mean, ylim=yL, col=pC[5], axes=FALSE, xlab="", ylab=""))
with(YUN, lines(x=DAP, y=CC_mean, lty=2, col=pC[5]))
box(); axis(2,labels=FALSE); axis(4);axis(1)

Biass correction of weather data

A bias correction of NASAPower weather data was performed using information from an in situ weather station. The correction methods applied included linear regression, quantile matching, and spline matching. Although the in situ weather station provided data for only one year, a 10-year weather dataset was generated using the bias-corrected NASAPower data (to avoid seasonality error), ensuring it accurately reflects local conditions during the experiment.

# data for model calibration

SOLANUM model calibration

The SOLANUM model has a tool called Parameter Estimator which translates expert knowledge about the crop phenology into the model parameters. This tool is based on allometric and heuristic methods that relate mathematical functions of the vegetative (canopy cover) and reproductive (tuber partitioning) crop growth with the parameters of the model. This tool is based on the following 3 principles:

  • Use generic mathematical functions to describe either canopy cover or tuber formation, regardless of varieties or environmental conditions, but with specific parameters that vary depending on varieties.
  • Apply numerical methods to estimate specific parameters by forcing the function to fit a minimum number of data points.
  • The pre-defined minimum number of data points needed to fit the functions must be obtained from expert knowledge. This comprises sowing and harvest dates, day of emergence, day of the maximum canopy cover, maximum canopy cover index, day of physiological maturity, and day of tuber initiation.

More details about the Parameter Estimator tool can be found in Harahagazwe et al. (2018).

Table 1. Crop phenology information used as input to the SOLANUM Parameter Estimator tool for model calibration. DAP = Days after planting.
DESCRIPTION BARI-ALU72 BARI-ALU78
Distance between plants (cm) 25 25
Distance between rows (cm) 60 60
Planting date 11th November 11th November
Emergency day (DAP) 12 14
Tuber initiation onset (DAP) 35 35
Time when plant reach its maximum canopy cover (DAP) 60 60
Harvest day (DAP) 90 90
Approximate value of the maximum canopy cover (fraction) 0.92 0.85
Yield at 70 DAP (t/ha) 28 25
Yield at harvest day (t/ha) 35 32
Dry matter concentration (%) 22.50 21.54
Figura 1: Parameter Estimator tool of the SOLANUM model.
Figura 1: Parameter Estimator tool of the SOLANUM model.

The Parameter Estimated tool was run with using information about crop phenology from literature (Mahmud et al. 2021, Islam et al. 2022) and from expert knowdledge (R. Ebna and H. Monower; personal comunication; 6 February 2024). Values of the crop parameters for both varieties were saved in CropParamsList.Rdata. Let’s see them in the following R chunk code:

load(url("https://github.com/jninanya/Ramirez-et-al-2024/raw/main/solanumR/CropParamsList.Rdata"))

CropParamsList$BariAlu72
##   wmax     tm     te      A     tu      b    RUE    DMc 
##   0.90 330.00 870.00   0.75 650.00 190.00   3.22   0.20 
## attr(,"CropParamsInfo")
## [1] "wmax : Maximum canopy cover index (fraction)"                        
## [2] "tm   : Thermal time at the maximum canopy cover growth rate (C-day)" 
## [3] "te   : Thermal time at the maximum canopy cover value (C-day)"       
## [4] "A    : Maximum harvest index (fraction)"                             
## [5] "tu   : Thermal time at maximum tuber partition rate (C-day)"         
## [6] "b    : Thermal time just before the tuber initiation process (C-day)"
## [7] "RUE  : Average radiation use efficiency (g/MJ)"                      
## [8] "DMc  : Dry matter concentration of tubers (fraction)"                
## attr(,"VarietyName")
## [1] "BariAlu72"

CropParamsList$BariAlu78
##   wmax     tm     te      A     tu      b    RUE    DMc 
##   0.90 330.00 870.00   0.75 650.00 190.00   3.22   0.20 
## attr(,"CropParamsInfo")
## [1] "wmax : Maximum canopy cover index (fraction)"                        
## [2] "tm   : Thermal time at the maximum canopy cover growth rate (C-day)" 
## [3] "te   : Thermal time at the maximum canopy cover value (C-day)"       
## [4] "A    : Maximum harvest index (fraction)"                             
## [5] "tu   : Thermal time at maximum tuber partition rate (C-day)"         
## [6] "b    : Thermal time just before the tuber initiation process (C-day)"
## [7] "RUE  : Average radiation use efficiency (g/MJ)"                      
## [8] "DMc  : Dry matter concentration of tubers (fraction)"                
## attr(,"VarietyName")
## [1] "BariAlu78"

Determination of optimum planting date

Determination of potential yields

#-------------------------------------------------------------------------------
# 5. Historical yield at 80 and 90 DAP 
#-------------------------------------------------------------------------------
## consider 20 years
#nyears <- 2000:2019
#
#swgDates <- c("2021-12-20", "2021-12-12", #"2021-12-20", "2021-12-12",
#              "2022-12-14", "2022-12-31", #"2022-12-14", "2022-12-31")
#hvtDates <- c("2022-03-27", "2022-03-27", #"2022-03-27", "2022-03-27",
#              "2023-03-16", "2023-03-16", #"2023-03-16", "2023-03-16")
#hvtDAP <- c(97, 105, 97, 105, 92, 75, 92, 75)
#
#CP <- CropParamsList[c("BariAlu72", "BariAlu78")]
#CParams <- list(CP[[1]], CP[[1]], CP[[2]], CP[[2]], 
#                CP[[1]], CP[[1]], CP[[2]], CP[[2]])  
#emgDays <- c(12, 12, 14, 14, 12, 12, 14, 14)
#
#wdata <- as.data.frame(wdata)
#
#o1 <- as.data.frame(matrix(nrow = length(nyears), ncol #= 8))
#o2 <- as.data.frame(matrix(nrow = length(nyears), ncol #= 8))
#o3 <- as.data.frame(matrix(nrow = length(nyears), ncol #= 8))
#
#cname <-   c("ZTV1S1", "CTV1S1", "ZTV2S1", "CTV2S1",
#             "ZTV1S2", "CTV1S2", "ZTV2S2", "CTV2S2")
#
#colnames(o1) <- colnames(o2) <- colnames(o3) <- cname
#rownames(o1) <- rownames(o2) <- rownames(o3) <- nyears
#
#for(i in 1:length(nyears)){
#  
#  for(j in 1:8){
#    
#    swg <- swgDates[j]
#    hvt <- hvtDates[j]
#    weather <- wdata
#    sowing <- paste(nyears[i], month(swg), day(swg), #sep = "-")
#    #harvest <- paste(nyears[i]+1, month(hvt), #day(hvt), sep = "-")
#    harvest <- as.Date(sowing) + hvtDAP[j]
#    EDay <- emgDays[j]
#    plantDensity = 12.5
#    CropParams <- CParams[[j]]
#    
#    res <- SolanumModel(weather, sowing, harvest, #EDay,plantDensity, CropParams)
#    nn <- nrow(res)
#    o1[i, j] <- as.character(res$date[1])
#    o2[i, j] <- round(res$fty[nn], 1)
#    o3[i, j] <- round(res$tdm[nn], 1)
#    
#  }
#}
#
#c1 <- list(date = o1, fty = o2, tdm = o3)
#
#
##-----------------------------------------------------#--------------------------
## 9. Final plot
##-----------------------------------------------------#--------------------------
## general plot settings
#par(oma    = c(3.0, 4.2, 2.0, 4.2),  # general margins
#    mfrow  = c(1, 2),                # number of #sub-figures
#    mar    = c(0.8, 0.1, 0.1, 0.1),  # margins per #sub-figure
#    ps     = 10,                     # text font size
#    family = "serif",                # text family
#    lwd    = 1.0,                    # line width
#    las    = 1,                      # style of axis #labels  
#    pch    = 20                      # plotting points
#)
#
#xT <- c(10, 25, 40, 55, 71, 86)
#xL <- c("10-Nov", "25-Nov", "10-Dec", "25-Dec", #"10-Jan", "25-Jan")
#
## sub-figure A
#b1 = boxplot(c1$fty[, 1:2], xlim = c(0.5,4.7), ylim = #c(28, 47), 
#             at = 1:2, axes = FALSE, boxwex = 0.6)
#b2 = boxplot(c1$fty[, 3:4], add = TRUE, at = c(3.2, #4.2), 
#             axes = FALSE, boxwex = 0.6)
#box()
#axis(side = 2)
#mtext(side = 2, text = bquote("YP (t ha"^{-1}*")"), #las = 0, 
#      line = 2.4, cex = 1.2)
#text(x = 0.5+0.025*(4.7-0.5), y = 47-0.050*(47-28), 
#     labels = bquote(bold("A)")))
#
#axis(side = 1, at = c(1,2,3.2,4.2), 
#     labels = c("ZT_BA72", "CT_BA72", "ZT_BA78", #"CT_BA78"), cex.axis = 1.2)
#
#
## sub-figure B
#b1 = boxplot(c1$fty[, 5:6], xlim = c(0.5,4.7), ylim = #c(28, 47), 
#             at = 1:2, axes = FALSE, boxwex = 0.6)
#b2 = boxplot(c1$fty[, 7:8], add = TRUE, at = c(3.2, #4.2), 
#             axes = FALSE, boxwex = 0.6)
#box()
#axis(side = 4) 
#mtext(side = 4, text = bquote("YP (t ha"^{-1}*")"), #las = 0, 
#      line = 3.0, cex = 1.2)
#text(x = 0.5+0.025*(4.7-0.5), y = 47-0.050*(47-28), 
#     labels = bquote(bold("B)")))
#
#axis(side = 1, at = c(1,2,3.2,4.2), 
#     labels = c("ZT_BA72", "CT_BA72", "ZT_BA78", #"CT_BA78"), cex.axis = 1.2)

Survey data collection

################################################################################
## 3. Thermal time computing
##################################################################################
#year0 = 2000
#year1 = 2022
#n <- as.Date("2023-01-31")-as.Date("2022-11-01")+1
#m <- year1-year0+1
#
##wdata <- wdata[wdata$YEAR>=year0 & #wdata$YEAR<=year1,]
#
#out0 <- as.data.frame(matrix(nrow = n, ncol = m))
#out1 <- as.data.frame(matrix(nrow = n, ncol = m))
#out2 <- as.data.frame(matrix(nrow = n, ncol = m))
#yy = seq(year0, year1, by = 1)
#
## load extra functions
#
#
#
#
#weather <- wdata
#
##for(jj in 1:m){
##  
##  date0 = as.Date(paste0(yy[jj], "-11-01"))-1
##  
##  for(ii in 1:n){
##  
##    
##    sDate = as.Date(date0 + ii)
##    sDate.name = paste(month(sDate), day(sDate), sep #= "-")
##    out0[ii, jj] = as.character(sDate)
##    
##    sowing = sDate
##    harvest = sowing + 90
##    ndays = as.numeric(harvest-sowing)+1
##    
#### variety Bari Alu 72    
##    source("https://raw.githubusercontent.com/jninany#a/Ramirez-et-a#l-2024/main/solanumR/BARI-Alu-72.R")
##    source("https://raw.githubusercontent.com/jninany#a/Ramirez-et-a#l-2024/main/solanumR/Module_PotentialGr#owth_V2.0.R")
##    
##    out1[ii, jj] = ifelse(df$fty[ndays]>20, #df$fty[ndays], NA)
##    
#### variety Bari Alu 78
##    source("https://raw.githubusercontent.com/jninany#a/Ramirez-et-a#l-2024/main/solanumR/BARI-Alu-78.R")
##    source("https://raw.githubusercontent.com/jninany#a/Ramirez-et-a#l-2024/main/solanumR/Module_PotentialGr#owth_V2.0.R")
##    
##    out2[ii, jj] = ifelse(df$fty[ndays]>20, #df$fty[ndays], NA)
##    
##    rownames(out0)[ii] = sDate.name
##    rownames(out1)[ii] = sDate.name
##    rownames(out2)[ii] = sDate.name
##  }
##  
##  colnames(out0)[jj] = yy[jj]
##  colnames(out1)[jj] = yy[jj]
##  colnames(out2)[jj] = yy[jj]
##  
##}
#
##d1 <- out1
##d2 <- out2
##
##boxplot(t(d1), col = "green", outline = FALSE, las=1,
##        ylab = "potential yield (t/ha)")
##
##boxplot(t(d2), col = "red", outline = FALSE, las=1,
##        ylab = "potential yield (t/ha)")
##
##
#### plot fty by planting date
##x <- 1:92
##fty_mean <- apply(out1, 1, mean, na.rm = TRUE)
##fty_q10 <- apply(out1, 1, quantile, probs = 0.10, #na.rm = TRUE)
##fty_q90 <- apply(out1, 1, quantile, probs = 0.90, #na.rm = TRUE)
##
##
###--------------------------------------------------
###--------------------------------------------------
##### General figure settings
##par(oma = c(4, 1, 0.5, 0.5),  # general margins
##    mfrow = c(2, 1),              # number of #sub-figures
##    mar = c(0,3,0,0),           # margins per #sub-figure
###    ps = 10,                      # text font size
##    family = "serif"              # text family
###    lwd = 0.5,                    # line width
###    las = 1,                      # style of axis #labels
###    pch = 20                      # plotting points
##)
##
##x=1:90
##y1=d1$`2021`[1:90]
##y2=d2$`2021`[1:90]
##plot(x, y1, type = "l", xlim = c(1,92), ylim = #c(23,57), 
##     xlab = "", ylab = "potential yield (t/ha)", axes #= FALSE, 
##     lwd = 2)
##box()
##lines(x, y2, lwd = 2, col = "gray50")
##
###axis(1, at = c(5,15,25,35,45,55,66,76,86), las = 2,
###     labels = #c("5-nov","15-nov","25-nov","5-dec","15-dec","25-dec#"#,"5-jan","15-jan","25-jan"))
###axis(1, las = 1, at = seq(5, 90, by=10))
##axis(2, las = 1, at=seq(25,55,by=5))
##abline(v=50, lty = 2, col = "blue")
##abline(v=74, lty = 2, col = "blue")
##
##text(47, 55.5, "ZT", col = "blue")
##text(71, 55.5, "CT", col = "blue")
##
##text(0, 55.5, expression(bold("A")))
##mtext(side=2, text=bquote("yield (t ha"^{"-1"}*")"), #cex = 1.5, #line = 2.4)
##
#####
##x=1:85
##y1=d1$`2022`[1:85]
##y2=d2$`2022`[1:85]
##plot(x, y1, type = "l", xlim = c(1,92), ylim = #c(23,52), 
##     xlab = "", ylab = "potential yield (t/ha)", axes #= FALSE, 
##     lwd = 2)
##box()
##lines(x, y2, lwd = 2, col = "gray50")
##
##axis(1, at = c(5,15,25,35,45,55,66,76,86), las = 2,
##     labels = #c("05-nov","15-nov","25-nov","05-dec","15-dec","25-de#c","05-jan","15-jan","25-jan"))
##axis(1, las = 1, at = seq(5, 90, by=10))
#axis(2, las = 1, at=seq(25,50,by=5))
#abline(v=44, lty = 2, col = "blue")
#abline(v=62, lty = 2, col = "blue")
#
#text(41, 51, "ZT", col = "blue")
#text(59, 51, "CT", col = "blue")
#
#text(0, 51, expression(bold("B")))
#
#mtext(side=2, text=bquote("yield (t ha"^{"-1"}*")"), cex = 1.5, #line = 2.4)
#

Stochastic Frontier Analysis

LS0tDQp0aXRsZTogIkRlY29tcG9zaXRpb24gb2YgcG90YXRvIHlpZWxkIGdhcCBpbiB0aGUgQW5kZWFuIG5vcnRoIG9mIFBlcnUiDQpzdWJ0aXRsZTogIkEgY3JvcCBtb2RlbGluZyBhcHByb2FjaCINCmF1dGhvcjogIkpvaGFuIE5pbmFueWEgKG5vbmkpIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0KI3NpdGU6IGJvb2tkb3duOjpib29rZG93bl9zaXRlDQojZG9jdW1lbnRjbGFzczogYm9vaw0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoNCiAgICBoaWdobGlnaHQ6IGthdGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IEZBTFNFDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQojIyBCYWNrZ3JvdW5kDQoNClRoaXMgcmVwb3NpdG9yeSBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgZm9yIHRoZSBhbmFseXNpcyBvZiB5aWVsZCBnYXAgZGVjb21wb3NpdGlvbiwgaW50ZWdyYXRpbmcgYm90aCBjcm9wIG1vZGVsaW5nIGFuZCBzdG9jaGFzdGljIGZyb250aWVyIGFuYWx5c2lzLg0KDQoNCiMjIExpYnJhcmllcyBhbmQgZXh0cmEgUi1maWxlcw0KDQpUaGUgZm9sbG93aW5nIGxpYnJhcmllcyB3ZXJlIHVzZWQ6DQoNCmBgYHtyfQ0KIyBsaWJyYXJpZXMNCmxpYnJhcnkobmFzYXBvd2VyKQ0KbGlicmFyeShtZXRlb3IpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KQWRkaXRpb25hbGx5LCBleHRyYSBSLWZpbGVzIG5lZWQgdG8gYmUgbG9hZGVkLiANCg0KYGBge3J9DQojIGV4dHJhIFItZmlsZXMNCmxvYWQodXJsKCJodHRwczovL2dpdGh1Yi5jb20vam5pbmFueWEvc29sYW51bVIvcmF3L3JlZnMvaGVhZHMvbWFpbi9Dcm9wUGFyYW1zTGlzdC5SZGF0YSIpKQ0Kc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vam5pbmFueWEvc29sYW51bVIvcmVmcy9oZWFkcy9tYWluL3RoZXJtYWxUaW1lLlIiKQ0Kc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vam5pbmFueWEvc29sYW51bVIvcmVmcy9oZWFkcy9tYWluL1NvbGFudW1Nb2RlbC5SIikNCg0KYGBgDQoNCg0KIyMgRmllbGQgZXhwZXJpbWVudCBhbmQgZGF0YSBjb2xsZWN0aW9uDQoNCkEgZmllbGQgZXhwZXJpbWVudCB3YXMgY29uZHVjdGVkIHRvIGRldGVybWluZSB0aGUgcG90ZW50aWFsIHlpZWxkIG9mIHRoZSBmaXZlIG1vc3QgY29tbW9ubHkgZ3Jvd24gcG90YXRvIHZhcmlldGllcyBpbiBDaHVnYXksIExhIExpYmVydGFkLCBQZXJ1OiBBbWFyaWxsaXMsIEJyZXRhw7FhLCBIdWV2byBkZSBJbmRpbywgUG9kZXJvc2EsIGFuZCBZdW5nYXkuIFRoZXNlIHZhcmlldGllcyB3ZXJlIG1hbmFnZWQgdW5kZXIgb3B0aW1hbCBncm93aW5nIGNvbmRpdGlvbnMgdG8gYXNzZXNzIHRoZWlyIHlpZWxkIHBvdGVudGlhbC4gVGhlIHRyaWFsIHRvb2sgcGxhY2UgZnJvbSAyNHRoIE9jdG9iZXIgMjAyMyB0byAxOHRoIEFwcmlsIDIwMjQsIHByb3ZpZGluZyBpbnNpZ2h0cyBpbnRvIGhvdyB0aGVzZSB2YXJpZXRpZXMgcGVyZm9ybSBpbiBhIGxvY2FsIGNvbnRleHQgdW5kZXIgImlkZWFsIiBjb25kaXRpb25zLg0KDQo8IS0tIEZpZ3VyZSAwMSAtLT4NCjxhIGlkPSJGaWd1cmUwMSI+PC9hPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij4NCiAgIVsqKkZpZ3VyYSAxOioqIEZpZWxkIGV4cGVyaW1lbnQgdG8gZGV0ZXJtaW5lIHBvdGVudGlhbCB5aWVsZCBvZiB0aGUgbW9zdCBjb21tb24gcG90YXRvIHZhcmlldGllcyBpbiBDaHVnYXkgRGlzdHJpYywgTGEtTGliZXJ0YWQgcmVnaW9uLCBQZXJ1Ll0oaHR0cHM6Ly9naXRodWIuY29tL2puaW5hbnlhL1BvdGF0b19ZaWVsZF9HYXAvYmxvYi9tYWluL0ZpZ3VyZXMvRmllbGRfZXhwZXJpbWVudC5wbmc/cmF3PXRydWUpe3dpZHRoPTgxJX0NCiAgPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHg7Ij48L3A+IDwhLS0gQWRkIHNvbWUgc3BhY2UgYmVsb3cgdGhlIGltYWdlIGNhcHRpb24gLS0+DQo8L2Rpdj4NCg0KQSB0b3RhbCBvZiBmaXZlIGJpb21hc3MgZXZhbHVhdGlvbnMgd2VyZSBjYXJyaWVkIG91dCwgd2hlcmUgdGhlIHBsYW50IG9yZ2FucyAobGVhZiwgc3RlbSwgcm9vdCwgYW5kIHR1YmVycykgd2VyZSBzZXBhcmF0ZWQsIGV2ZXJ5IHR3byB3ZWVrcyBmcm9tIHRoZSB0dWJlcml6YXRpb24gc3RhZ2UgdG8gaGFydmVzdC4gQWRkaXRpb25hbGx5LCBmaWZ0ZWVuIGNhbm9weSBjb3ZlciBldmFsdWF0aW9ucyB3ZXJlIGNvbmR1Y3RlZCBmcm9tIHBsYW50IGVtZXJnZW5jZSB0byBzZW5lc2NlbmNlLCBwcm92aWRpbmcgZGV0YWlsZWQgZGF0YSBvbiB0aGUgZ3Jvd3RoIGFuZCBkZXZlbG9wbWVudCBvZiB0aGUgZml2ZSBwb3RhdG8gdmFyaWV0aWVzLiBUaGUgZGF0YXNldCByZWxhdGVkIHRvIHRoaXMgZmllbGQgZXhwZXJpbWVudCBjYW4gYmUgZG93bmxvYWRlZCBhdCBodHRwczovL2RvaS5vcmcvMTAuMjEyMjMvSlBBM05aLiANCg0KIyMjIEJpb21hc3MgZGF0YQ0KTGV0cyBzZWUgdGhlIGhhcnZlc3QgaW5kZXgsIGkuZS4sIHRoZSByYXRpbyBvZiB0dWJlciBiaW9tYXNzIG92ZXIgdG90YWwgYmlvbWFzcy4gQ2xpY2sgb24gYGNvZGVgIHRvIHNlZSB0aGUgUiBjaHVuayBjb2RlIGZvciB0aGUgY2Fub3B5IGJpb21hc3MgZGF0YS4NCg0KYGBge3IgIGNsYXNzLnNvdXJjZT0nZm9sZC1oaWRlJywgcmVzdWx0cz0naG9sZCcsIGZpZy53aWR0aD05LGZpZy5oZWlnaHQ9Mi41fQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBTVU1NQVJZIE9GIEJJT01BU1MgREFUQQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQkQgPC0gcmVhZC5jc3YoImh0dHBzOi8vZ2l0aHViLmNvbS9qbmluYW55YS9Qb3RhdG9fWWllbGRfR2FwL3Jhdy9yZWZzL2hlYWRzL21haW4vRGF0YS9iaW9tYXNzX2RhdGFzZXQuY3N2IikNCiNoZWFkKEJEKQ0KDQojIENvbnN0YW50IHRvIGNvbnZlcnQga2cvcGxhbnQgdG8gdC9oYQ0KayA9ICgxLzEwMDApKigxLygwLjMqMSkpKigxMDAwMC8xKSowLjAwMQ0KDQojIE1hdHRlciBjb25jZW50cmF0aW9uIG9mIDxvcmdhbj4gKE1DWCkNCkJEJE1DTCA8LSBCRCRzRExNL0JEJHNGTE0gICAgICAjIEwgPSBsZWFmDQpCRCRNQ1MgPC0gQkQkc0RTTS9CRCRzRlNNICAgICAgIyBTID0gc3RlbQ0KQkQkTUNSIDwtIEJEJHNEUk0vQkQkc0ZSTSAgICAgICMgUiA9IHJvb3QNCkJEJE1DVCA8LSBCRCRzRFRNL0JEJHNGVE0gICAgICAjIFQgPSB0dWJlcg0KQkQkRE1DIDwtIEJEJE1DVCAgICAgICAgICAgICAgICAgDQoNCiMgRHJ5IDxvcmdhbj4gbWF0dGVyIChEWE0pDQpCRCRETE0gPC0gQkQkRkxNKkJEJE1DTA0KQkQkRFNNIDwtIEJEJEZTTSpCRCRNQ1MNCkJEJERSTSA8LSBCRCRGUk0qQkQkTUNSDQpCRCREVE0gPC0gQkQkRlRNKkJEJE1DVA0KDQojIEZyZXNoIDxvcmdhbj4geWllbGQgKEZYWSkNCkJEJEZMWSA8LSBCRCRGTE0qaw0KQkQkRlNZIDwtIEJEJEZTTSprDQpCRCRGUlkgPC0gQkQkRlJNKmsNCkJEJEZUWSA8LSBCRCRGVE0qayAgICAgICAgICAgICAgIA0KDQojIERyeSA8b3JnYW4+IHlpZWxkIChEWFkpDQpCRCRETFkgPC0gQkQkRExNKmsNCkJEJERTWSA8LSBCRCREU00qaw0KQkQkRFJZIDwtIEJEJERSTSprDQpCRCREVFkgPC0gQkQkRFRNKmsNCg0KIyBUb3RhbCBkcnkgbWF0dGVyIChURE0pIGFuZCBoYXJ2ZXN0IGluZGV4IChISSkNCkJEJFRETSA8LSBCRCRETFkgKyBCRCREU1kgKyBCRCREUlkgKyBCRCREVFkNCkJEJEhJIDwtIEJEJERUWS9CRCRURE0NCg0KIyBTdW1tYXJ5OiBtZWFuIGFuZCBzdGFuZGFyZCBlcnJvciBmb3IgSEkNCnNtckJEIDwtIEJEICU+JQ0KICBncm91cF9ieShDT0RFLCBFVkFMLCBEQVApICU+JQ0KICBzdW1tYXJpc2UoRExZID0gbWVhbihETFksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBEU1kgPSBtZWFuKERTWSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIERSWSA9IG1lYW4oRFJZLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgRFRZID0gbWVhbihEVFksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBGVFkgPSBtZWFuKEZUWSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIFRETSA9IG1lYW4oVERNLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgRE1DID0gbWVhbihETUMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBOID0gc3VtKCFpcy5uYShISSkpLA0KICAgICAgICAgICAgbmQgPSBuKCksDQogICAgICAgICAgICBISV9tZWFuID0gbWVhbihISSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIEhJX3NlID0gc2QoSEksIG5hLnJtID0gVFJVRSkvc3FydChOKQ0KICAgICkNCnNtckJEIDwtIGFzLmRhdGEuZnJhbWUoc21yQkQpDQoNCiMgRGF0YSBmcmFtZSBmb3IgZWFjaCB2YXJpZXR5DQpBTUEgPC0gc21yQkRbc21yQkQkQ09ERT09IkFNQSIsXQ0KQlJFIDwtIHNtckJEW3NtckJEJENPREU9PSJCUkUiLF0NCkhVRSA8LSBzbXJCRFtzbXJCRCRDT0RFPT0iSFVFIixdDQpQT0QgPC0gc21yQkRbc21yQkQkQ09ERT09IlBPRCIsXQ0KWVVOIDwtIHNtckJEW3NtckJEJENPREU9PSJZVU4iLF0NCg0KIyBHZW5lcmFsIHBsb3Qgc2V0dGluZ3MNCnBhcihvbWEgICAgPSBjKDQuNSwgNC41LCAwLjUsIDMpLCAgIyBnZW5lcmFsIG1hcmdpbnMNCiAgICBtZnJvdyAgPSBjKDEsIDUpLCAgICAgICAgICAgICAgICAjIG51bWJlciBvZiBzdWItZmlndXJlcw0KICAgIG1hciAgICA9IGMoMCwgMCwgMCwgMCksICAgICAgICAgICMgbWFyZ2lucyBwZXIgc3ViLWZpZ3VyZQ0KICAgIGZhbWlseSA9ICJzZXJpZiIsICAgICAgICAgICAgICAgICMgdGV4dCBmYW1pbHkNCiAgICBsd2QgICAgPSAxLjAsICAgICAgICAgICAgICAgICAgICAjIGxpbmUgd2lkdGgNCiAgICBsYXMgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAjIHN0eWxlIG9mIGF4aXMgbGFiZWxzICANCiAgICBwY2ggICAgPSAxOSwgICAgICAgICAgICAgICAgICAgICAjIHBsb3R0aW5nIHBvaW50cw0KICAgIGNleCAgICA9IDAuOA0KKQ0KDQojIENvbG9yIGFuZCB5LWF4aXMgbGltaXRzDQpwQyA8LSBjKCJibHVlIiwieWVsbG93IiwiZ3JlZW4iLCJjeWFuIiwicmVkIikgDQp5TCA8LSBjKDAsMSkgDQoNCiMgUGxvdCBmb3IgQW1hcmlsaXMNCndpdGgoQU1BLCBwbG90KHg9REFQLCB5PUhJX21lYW4sIHlsaW09eUwsIGNvbD1wQ1sxXSwgYXhlcz1GQUxTRSwgeGxhYj0iIiwgeWxhYj0iIikpDQp3aXRoKEFNQSwgbGluZXMoeD1EQVAsIHk9SElfbWVhbiwgbHR5PTIsIGNvbD1wQ1sxXSkpDQpib3goKTsgYXhpcygyKTsgYXhpcyg0LCBsYWJlbHM9RkFMU0UpO2F4aXMoMSkNCm10ZXh0KHNpZGU9MiwgIkhhcnZlc3QgSW5kZXgiLCBsaW5lPTMsIGxhcz0wKQ0KDQojIFBsb3QgZm9yIEJyZXRhbmENCndpdGgoQlJFLCBwbG90KHg9REFQLCB5PUhJX21lYW4sIHlsaW09eUwsIGNvbD1wQ1syXSwgYXhlcz1GQUxTRSwgeGxhYj0iIiwgeWxhYj0iIikpDQp3aXRoKEJSRSwgbGluZXMoeD1EQVAsIHk9SElfbWVhbiwgbHR5PTIsIGNvbD1wQ1syXSkpDQpib3goKTsgYXhpcygyLGxhYmVscz1GQUxTRSk7IGF4aXMoNCwgbGFiZWxzPUZBTFNFKTtheGlzKDEpDQoNCiMgUGxvdCBmb3IgSHVldm8gZGUgSW5kaW8NCndpdGgoSFVFLCBwbG90KHg9REFQLCB5PUhJX21lYW4sIHlsaW09eUwsIGNvbD1wQ1szXSwgYXhlcz1GQUxTRSwgeGxhYj0iIiwgeWxhYj0iIikpDQp3aXRoKEhVRSwgbGluZXMoeD1EQVAsIHk9SElfbWVhbiwgbHR5PTIsIGNvbD1wQ1szXSkpDQpib3goKTsgYXhpcygyLGxhYmVscz1GQUxTRSk7IGF4aXMoNCwgbGFiZWxzPUZBTFNFKTtheGlzKDEpDQptdGV4dChzaWRlPTEsICJEYXlzIGFmdGVyIHBsYW50aW5nIiwgbGluZT0zKQ0KDQojIFBsb3QgZm9yIFBvZGVyb3NhDQp3aXRoKFBPRCwgcGxvdCh4PURBUCwgeT1ISV9tZWFuLCB5bGltPXlMLCBjb2w9cENbNF0sIGF4ZXM9RkFMU0UsIHhsYWI9IiIsIHlsYWI9IiIpKQ0Kd2l0aChQT0QsIGxpbmVzKHg9REFQLCB5PUhJX21lYW4sIGx0eT0yLCBjb2w9cENbNF0pKQ0KYm94KCk7IGF4aXMoMixsYWJlbHM9RkFMU0UpOyBheGlzKDQsIGxhYmVscz1GQUxTRSk7YXhpcygxKQ0KDQojIFBsb3QgZm9yIFl1bmdheQ0Kd2l0aChZVU4sIHBsb3QoeD1EQVAsIHk9SElfbWVhbiwgeWxpbT15TCwgY29sPXBDWzVdLCBheGVzPUZBTFNFLCB4bGFiPSIiLCB5bGFiPSIiKSkNCndpdGgoWVVOLCBsaW5lcyh4PURBUCwgeT1ISV9tZWFuLCBsdHk9MiwgY29sPXBDWzVdKSkNCmJveCgpOyBheGlzKDIsbGFiZWxzPUZBTFNFKTsgYXhpcyg0KTtheGlzKDEpDQoNCmBgYA0KDQojIyMgQ2Fub3B5IGNvdmVyIGRhdGENCkNsaWNrIG9uIGBjb2RlYCB0byBzZWUgdGhlIFIgY2h1bmsgY29kZSBmb3IgdGhlIGNhbm9weSBjb3ZlciBkYXRhLg0KDQpgYGB7ciAgY2xhc3Muc291cmNlPSdmb2xkLWhpZGUnLCByZXN1bHRzPSdob2xkJywgZmlnLndpZHRoPTksZmlnLmhlaWdodD0yLjV9DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFNVTU1BUlkgT0YgQ0FOT1BZIENPVkVSIERBVEENCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkNEIDwtIHJlYWQuY3N2KCJodHRwczovL2dpdGh1Yi5jb20vam5pbmFueWEvUG90YXRvX1lpZWxkX0dhcC9yYXcvcmVmcy9oZWFkcy9tYWluL0RhdGEvY2Fub3B5X2NvdmVyX2RhdGFzZXQuY3N2IikNCiNoZWFkKENEKQ0KDQojIFN1bW1hcnkgYnkgdmFyaWV0eSBhbmQgZXZhbHVhdGlvbg0Kc21yQ0QgPC0gQ0QgJT4lDQogIGdyb3VwX2J5KENPREUsIERBUCkgJT4lDQogIHN1bW1hcmlzZShOID0gc3VtKCFpcy5uYShDQykpLA0KICAgICAgICAgICAgbmQgPSBuKCksDQogICAgICAgICAgICBDQ19tZWFuID0gbWVhbihDQywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIENDX3NlID0gc2QoQ0MsIG5hLnJtID0gVFJVRSkvc3FydChOKSwNCiAgKQ0KDQpzbXJDRCA8LSBhcy5kYXRhLmZyYW1lKHNtckNEKQ0KDQojIERhdGEgZnJhbWUgZm9yIGVhY2ggdmFyaWV0eQ0KQU1BIDwtIHNtckNEW3NtckNEJENPREU9PSJBTUEiLF0NCkJSRSA8LSBzbXJDRFtzbXJDRCRDT0RFPT0iQlJFIixdDQpIVUUgPC0gc21yQ0Rbc21yQ0QkQ09ERT09IkhVRSIsXQ0KUE9EIDwtIHNtckNEW3NtckNEJENPREU9PSJQT0QiLF0NCllVTiA8LSBzbXJDRFtzbXJDRCRDT0RFPT0iWVVOIixdDQoNCiMgR2VuZXJhbCBwbG90IHNldHRpbmdzDQpwYXIob21hICAgID0gYyg0LjUsIDQuNSwgMC41LCAzKSwgICMgZ2VuZXJhbCBtYXJnaW5zDQogICAgbWZyb3cgID0gYygxLCA1KSwgICAgICAgICAgICAgICAgIyBudW1iZXIgb2Ygc3ViLWZpZ3VyZXMNCiAgICBtYXIgICAgPSBjKDAsIDAsIDAsIDApLCAgICAgICAgICAjIG1hcmdpbnMgcGVyIHN1Yi1maWd1cmUNCiAgICBmYW1pbHkgPSAic2VyaWYiLCAgICAgICAgICAgICAgICAjIHRleHQgZmFtaWx5DQogICAgbHdkICAgID0gMS4wLCAgICAgICAgICAgICAgICAgICAgIyBsaW5lIHdpZHRoDQogICAgbGFzICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgIyBzdHlsZSBvZiBheGlzIGxhYmVscyAgDQogICAgcGNoICAgID0gMTksICAgICAgICAgICAgICAgICAgICAgIyBwbG90dGluZyBwb2ludHMNCiAgICBjZXggICAgPSAwLjgNCikNCg0KIyBDb2xvciBhbmQgeS1heGlzIGxpbWl0cw0KcEMgPC0gYygiYmx1ZSIsInllbGxvdyIsImdyZWVuIiwiY3lhbiIsInJlZCIpIA0KeUwgPC0gYygwLDEwMCkgDQoNCiMgUGxvdCBmb3IgQW1hcmlsaXMNCndpdGgoQU1BLCBwbG90KHg9REFQLCB5PUNDX21lYW4sIHlsaW09eUwsIGNvbD1wQ1sxXSwgYXhlcz1GQUxTRSwgeGxhYj0iIiwgeWxhYj0iIikpDQp3aXRoKEFNQSwgbGluZXMoeD1EQVAsIHk9Q0NfbWVhbiwgbHR5PTIsIGNvbD1wQ1sxXSkpDQpib3goKTsgYXhpcygyKTsgYXhpcyg0LCBsYWJlbHM9RkFMU0UpO2F4aXMoMSkNCm10ZXh0KHNpZGU9MiwgIkNhbm9weSBjb3ZlciAoJSkiLCBsaW5lPTMsIGxhcz0wKQ0KDQojIFBsb3QgZm9yIEJyZXRhbmENCndpdGgoQlJFLCBwbG90KHg9REFQLCB5PUNDX21lYW4sIHlsaW09eUwsIGNvbD1wQ1syXSwgYXhlcz1GQUxTRSwgeGxhYj0iIiwgeWxhYj0iIikpDQp3aXRoKEJSRSwgbGluZXMoeD1EQVAsIHk9Q0NfbWVhbiwgbHR5PTIsIGNvbD1wQ1syXSkpDQpib3goKTsgYXhpcygyLGxhYmVscz1GQUxTRSk7IGF4aXMoNCwgbGFiZWxzPUZBTFNFKTtheGlzKDEpDQoNCiMgUGxvdCBmb3IgSHVldm8gZGUgSW5kaW8NCndpdGgoSFVFLCBwbG90KHg9REFQLCB5PUNDX21lYW4sIHlsaW09eUwsIGNvbD1wQ1szXSwgYXhlcz1GQUxTRSwgeGxhYj0iIiwgeWxhYj0iIikpDQp3aXRoKEhVRSwgbGluZXMoeD1EQVAsIHk9Q0NfbWVhbiwgbHR5PTIsIGNvbD1wQ1szXSkpDQpib3goKTsgYXhpcygyLGxhYmVscz1GQUxTRSk7IGF4aXMoNCwgbGFiZWxzPUZBTFNFKTtheGlzKDEpDQptdGV4dChzaWRlPTEsICJEYXlzIGFmdGVyIHBsYW50aW5nIiwgbGluZT0zKQ0KDQojIFBsb3QgZm9yIFBvZGVyb3NhDQp3aXRoKFBPRCwgcGxvdCh4PURBUCwgeT1DQ19tZWFuLCB5bGltPXlMLCBjb2w9cENbNF0sIGF4ZXM9RkFMU0UsIHhsYWI9IiIsIHlsYWI9IiIpKQ0Kd2l0aChQT0QsIGxpbmVzKHg9REFQLCB5PUNDX21lYW4sIGx0eT0yLCBjb2w9cENbNF0pKQ0KYm94KCk7IGF4aXMoMixsYWJlbHM9RkFMU0UpOyBheGlzKDQsIGxhYmVscz1GQUxTRSk7YXhpcygxKQ0KDQojIFBsb3QgZm9yIFl1bmdheQ0Kd2l0aChZVU4sIHBsb3QoeD1EQVAsIHk9Q0NfbWVhbiwgeWxpbT15TCwgY29sPXBDWzVdLCBheGVzPUZBTFNFLCB4bGFiPSIiLCB5bGFiPSIiKSkNCndpdGgoWVVOLCBsaW5lcyh4PURBUCwgeT1DQ19tZWFuLCBsdHk9MiwgY29sPXBDWzVdKSkNCmJveCgpOyBheGlzKDIsbGFiZWxzPUZBTFNFKTsgYXhpcyg0KTtheGlzKDEpDQoNCmBgYA0KDQoNCiMjIEJpYXNzIGNvcnJlY3Rpb24gb2Ygd2VhdGhlciBkYXRhDQpBIGJpYXMgY29ycmVjdGlvbiBvZiBOQVNBUG93ZXIgd2VhdGhlciBkYXRhIHdhcyBwZXJmb3JtZWQgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSBhbiBpbiBzaXR1IHdlYXRoZXIgc3RhdGlvbi4gVGhlIGNvcnJlY3Rpb24gbWV0aG9kcyBhcHBsaWVkIGluY2x1ZGVkIGxpbmVhciByZWdyZXNzaW9uLCBxdWFudGlsZSBtYXRjaGluZywgYW5kIHNwbGluZSBtYXRjaGluZy4gQWx0aG91Z2ggdGhlIGluIHNpdHUgd2VhdGhlciBzdGF0aW9uIHByb3ZpZGVkIGRhdGEgZm9yIG9ubHkgb25lIHllYXIsIGEgMTAteWVhciB3ZWF0aGVyIGRhdGFzZXQgd2FzIGdlbmVyYXRlZCB1c2luZyB0aGUgYmlhcy1jb3JyZWN0ZWQgTkFTQVBvd2VyIGRhdGEgKHRvIGF2b2lkIHNlYXNvbmFsaXR5IGVycm9yKSwgZW5zdXJpbmcgaXQgYWNjdXJhdGVseSByZWZsZWN0cyBsb2NhbCBjb25kaXRpb25zIGR1cmluZyB0aGUgZXhwZXJpbWVudC4NCg0KYGBge3J9DQojIGRhdGEgZm9yIG1vZGVsIGNhbGlicmF0aW9uDQoNCg0KYGBgDQoNCg0KIyMgU09MQU5VTSBtb2RlbCBjYWxpYnJhdGlvbg0KDQpUaGUgU09MQU5VTSBtb2RlbCBoYXMgYSB0b29sIGNhbGxlZCAqKlBhcmFtZXRlciBFc3RpbWF0b3IqKiB3aGljaCB0cmFuc2xhdGVzIGV4cGVydCBrbm93bGVkZ2UgYWJvdXQgdGhlIGNyb3AgcGhlbm9sb2d5IGludG8gdGhlIG1vZGVsIHBhcmFtZXRlcnMuIFRoaXMgdG9vbCBpcyBiYXNlZCBvbiBhbGxvbWV0cmljIGFuZCBoZXVyaXN0aWMgbWV0aG9kcyB0aGF0IHJlbGF0ZSBtYXRoZW1hdGljYWwgZnVuY3Rpb25zIG9mIHRoZSB2ZWdldGF0aXZlIChjYW5vcHkgY292ZXIpIGFuZCByZXByb2R1Y3RpdmUgKHR1YmVyIHBhcnRpdGlvbmluZykgY3JvcCBncm93dGggd2l0aCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbW9kZWwuIFRoaXMgdG9vbCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIDMgcHJpbmNpcGxlczoNCg0KKiBVc2UgZ2VuZXJpYyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zIHRvIGRlc2NyaWJlIGVpdGhlciBjYW5vcHkgY292ZXIgb3IgdHViZXIgZm9ybWF0aW9uLCByZWdhcmRsZXNzIG9mIHZhcmlldGllcyBvciBlbnZpcm9ubWVudGFsIGNvbmRpdGlvbnMsIGJ1dCB3aXRoIHNwZWNpZmljIHBhcmFtZXRlcnMgdGhhdCB2YXJ5IGRlcGVuZGluZyBvbiB2YXJpZXRpZXMuDQoqIEFwcGx5IG51bWVyaWNhbCBtZXRob2RzIHRvIGVzdGltYXRlIHNwZWNpZmljIHBhcmFtZXRlcnMgYnkgZm9yY2luZyB0aGUgZnVuY3Rpb24gdG8gZml0IGEgbWluaW11bSBudW1iZXIgb2YgZGF0YSBwb2ludHMuDQoqIFRoZSBwcmUtZGVmaW5lZCBtaW5pbXVtIG51bWJlciBvZiBkYXRhIHBvaW50cyBuZWVkZWQgdG8gZml0IHRoZSBmdW5jdGlvbnMgbXVzdCBiZSBvYnRhaW5lZCBmcm9tIGV4cGVydCBrbm93bGVkZ2UuIFRoaXMgY29tcHJpc2VzIHNvd2luZyBhbmQgaGFydmVzdCBkYXRlcywgZGF5IG9mIGVtZXJnZW5jZSwgZGF5IG9mIHRoZSBtYXhpbXVtIGNhbm9weSBjb3ZlciwgbWF4aW11bSBjYW5vcHkgY292ZXIgaW5kZXgsIGRheSBvZiBwaHlzaW9sb2dpY2FsIG1hdHVyaXR5LCBhbmQgZGF5IG9mIHR1YmVyIGluaXRpYXRpb24uDQoNCk1vcmUgZGV0YWlscyBhYm91dCB0aGUgUGFyYW1ldGVyIEVzdGltYXRvciB0b29sIGNhbiBiZSBmb3VuZCBpbiBbSGFyYWhhZ2F6d2UgZXQgYWwuICgyMDE4KV0oI0hhcmFoYWdhendlLWV0LWFsLTIwMTgpLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCnkxIDwtIGMoIkRpc3RhbmNlIGJldHdlZW4gcGxhbnRzIChjbSkiLCAiRGlzdGFuY2UgYmV0d2VlbiByb3dzIChjbSkiLCAiUGxhbnRpbmcgZGF0ZSIsICJFbWVyZ2VuY3kgZGF5IChEQVApIiwgIlR1YmVyIGluaXRpYXRpb24gb25zZXQgKERBUCkiLCAiVGltZSB3aGVuIHBsYW50IHJlYWNoIGl0cyBtYXhpbXVtIGNhbm9weSBjb3ZlciAoREFQKSIsICJIYXJ2ZXN0IGRheSAoREFQKSIsICJBcHByb3hpbWF0ZSB2YWx1ZSBvZiB0aGUgbWF4aW11bSBjYW5vcHkgY292ZXIgKGZyYWN0aW9uKSIsICJZaWVsZCBhdCA3MCBEQVAgKHQvaGEpIiwgIllpZWxkIGF0IGhhcnZlc3QgZGF5ICh0L2hhKSIsICJEcnkgbWF0dGVyIGNvbmNlbnRyYXRpb24gKCUpIikNCnkyIDwtIGMoIjI1IiwgIjYwIiwgIjExdGggTm92ZW1iZXIiLCAiMTIiLCAiMzUiLCAiNjAiLCAiOTAiLCAiMC45MiIsICIyOCIsICIzNSIsICIyMi41MCIpDQp5MyA8LSBjKCIyNSIsICI2MCIsICIxMXRoIE5vdmVtYmVyIiwgIjE0IiwgIjM1IiwgIjYwIiwgIjkwIiwgIjAuODUiLCAiMjUiLCAiMzIiLCAiMjEuNTQiKQ0KDQp0YiA8LSBkYXRhLmZyYW1lKHkxLCB5MiwgeTMpDQpjb2xuYW1lcyh0YikgPC0gYygiREVTQ1JJUFRJT04iLCAiQkFSSS1BTFU3MiIsICJCQVJJLUFMVTc4IikNCg0Ka25pdHI6OmthYmxlKHRiLCBjYXB0aW9uID0gIlRhYmxlIDEuIENyb3AgcGhlbm9sb2d5IGluZm9ybWF0aW9uIHVzZWQgYXMgaW5wdXQgdG8gdGhlIFNPTEFOVU0gUGFyYW1ldGVyIEVzdGltYXRvciB0b29sIGZvciBtb2RlbCBjYWxpYnJhdGlvbi4gREFQID0gRGF5cyBhZnRlciBwbGFudGluZy4iKQ0KDQpgYGANCg0KPCEtLSBGaWd1cmUgMDEgLS0+DQo8YSBpZD0iRmlndXJlMDEiPjwvYT4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+DQogICFbKipGaWd1cmEgMToqKiBQYXJhbWV0ZXIgRXN0aW1hdG9yIHRvb2wgb2YgdGhlIFNPTEFOVU0gbW9kZWwuXShodHRwczovL2dpdGh1Yi5jb20vam5pbmFueWEvUmFtaXJlei1ldC1hbC0yMDI0L2Jsb2IvbWFpbi9zb2xhbnVtUi9GaWd1cmVzL1BhcmFtZXRlci1Fc3RpbWF0b3ItVG9vbC5wbmc/cmF3PXRydWUpe3dpZHRoPTgxJX0NCiAgPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHg7Ij48L3A+IDwhLS0gQWRkIHNvbWUgc3BhY2UgYmVsb3cgdGhlIGltYWdlIGNhcHRpb24gLS0+DQo8L2Rpdj4NCg0KVGhlIFBhcmFtZXRlciBFc3RpbWF0ZWQgdG9vbCB3YXMgcnVuIHdpdGggdXNpbmcgaW5mb3JtYXRpb24gYWJvdXQgY3JvcCBwaGVub2xvZ3kgZnJvbSBsaXRlcmF0dXJlIChNYWhtdWQgZXQgYWwuIDIwMjEsIElzbGFtIGV0IGFsLiAyMDIyKSBhbmQgZnJvbSBleHBlcnQga25vd2RsZWRnZSAoUi4gRWJuYSBhbmQgSC4gTW9ub3dlcjsgcGVyc29uYWwgY29tdW5pY2F0aW9uOyA2IEZlYnJ1YXJ5IDIwMjQpLiBWYWx1ZXMgb2YgdGhlIGNyb3AgcGFyYW1ldGVycyBmb3IgYm90aCB2YXJpZXRpZXMgd2VyZSBzYXZlZCBpbiBgQ3JvcFBhcmFtc0xpc3QuUmRhdGFgLiBMZXQncyBzZWUgdGhlbSBpbiB0aGUgZm9sbG93aW5nIFIgY2h1bmsgY29kZToNCg0KYGBge3IgY3JvcC1wYXJhbWV0ZXJzLWRhdGFiYXNlLCByZXN1bHRzPSdzaG93JywgY29sbGFwc2UgPSBUUlVFfQ0KbG9hZCh1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9qbmluYW55YS9SYW1pcmV6LWV0LWFsLTIwMjQvcmF3L21haW4vc29sYW51bVIvQ3JvcFBhcmFtc0xpc3QuUmRhdGEiKSkNCg0KQ3JvcFBhcmFtc0xpc3QkQmFyaUFsdTcyDQoNCkNyb3BQYXJhbXNMaXN0JEJhcmlBbHU3OA0KYGBgDQoNCiMjIERldGVybWluYXRpb24gb2Ygb3B0aW11bSBwbGFudGluZyBkYXRlDQoNCiMjIERldGVybWluYXRpb24gb2YgcG90ZW50aWFsIHlpZWxkcw0KDQpgYGB7cn0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgNS4gSGlzdG9yaWNhbCB5aWVsZCBhdCA4MCBhbmQgOTAgREFQIA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMjIGNvbnNpZGVyIDIwIHllYXJzDQojbnllYXJzIDwtIDIwMDA6MjAxOQ0KIw0KI3N3Z0RhdGVzIDwtIGMoIjIwMjEtMTItMjAiLCAiMjAyMS0xMi0xMiIsICMiMjAyMS0xMi0yMCIsICIyMDIxLTEyLTEyIiwNCiMgICAgICAgICAgICAgICIyMDIyLTEyLTE0IiwgIjIwMjItMTItMzEiLCAjIjIwMjItMTItMTQiLCAiMjAyMi0xMi0zMSIpDQojaHZ0RGF0ZXMgPC0gYygiMjAyMi0wMy0yNyIsICIyMDIyLTAzLTI3IiwgIyIyMDIyLTAzLTI3IiwgIjIwMjItMDMtMjciLA0KIyAgICAgICAgICAgICAgIjIwMjMtMDMtMTYiLCAiMjAyMy0wMy0xNiIsICMiMjAyMy0wMy0xNiIsICIyMDIzLTAzLTE2IikNCiNodnREQVAgPC0gYyg5NywgMTA1LCA5NywgMTA1LCA5MiwgNzUsIDkyLCA3NSkNCiMNCiNDUCA8LSBDcm9wUGFyYW1zTGlzdFtjKCJCYXJpQWx1NzIiLCAiQmFyaUFsdTc4IildDQojQ1BhcmFtcyA8LSBsaXN0KENQW1sxXV0sIENQW1sxXV0sIENQW1syXV0sIENQW1syXV0sIA0KIyAgICAgICAgICAgICAgICBDUFtbMV1dLCBDUFtbMV1dLCBDUFtbMl1dLCBDUFtbMl1dKSAgDQojZW1nRGF5cyA8LSBjKDEyLCAxMiwgMTQsIDE0LCAxMiwgMTIsIDE0LCAxNCkNCiMNCiN3ZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHdkYXRhKQ0KIw0KI28xIDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSBsZW5ndGgobnllYXJzKSwgbmNvbCAjPSA4KSkNCiNvMiA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKG55ZWFycyksIG5jb2wgIz0gOCkpDQojbzMgPC0gYXMuZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IGxlbmd0aChueWVhcnMpLCBuY29sICM9IDgpKQ0KIw0KI2NuYW1lIDwtICAgYygiWlRWMVMxIiwgIkNUVjFTMSIsICJaVFYyUzEiLCAiQ1RWMlMxIiwNCiMgICAgICAgICAgICAgIlpUVjFTMiIsICJDVFYxUzIiLCAiWlRWMlMyIiwgIkNUVjJTMiIpDQojDQojY29sbmFtZXMobzEpIDwtIGNvbG5hbWVzKG8yKSA8LSBjb2xuYW1lcyhvMykgPC0gY25hbWUNCiNyb3duYW1lcyhvMSkgPC0gcm93bmFtZXMobzIpIDwtIHJvd25hbWVzKG8zKSA8LSBueWVhcnMNCiMNCiNmb3IoaSBpbiAxOmxlbmd0aChueWVhcnMpKXsNCiMgIA0KIyAgZm9yKGogaW4gMTo4KXsNCiMgICAgDQojICAgIHN3ZyA8LSBzd2dEYXRlc1tqXQ0KIyAgICBodnQgPC0gaHZ0RGF0ZXNbal0NCiMgICAgd2VhdGhlciA8LSB3ZGF0YQ0KIyAgICBzb3dpbmcgPC0gcGFzdGUobnllYXJzW2ldLCBtb250aChzd2cpLCBkYXkoc3dnKSwgI3NlcCA9ICItIikNCiMgICAgI2hhcnZlc3QgPC0gcGFzdGUobnllYXJzW2ldKzEsIG1vbnRoKGh2dCksICNkYXkoaHZ0KSwgc2VwID0gIi0iKQ0KIyAgICBoYXJ2ZXN0IDwtIGFzLkRhdGUoc293aW5nKSArIGh2dERBUFtqXQ0KIyAgICBFRGF5IDwtIGVtZ0RheXNbal0NCiMgICAgcGxhbnREZW5zaXR5ID0gMTIuNQ0KIyAgICBDcm9wUGFyYW1zIDwtIENQYXJhbXNbW2pdXQ0KIyAgICANCiMgICAgcmVzIDwtIFNvbGFudW1Nb2RlbCh3ZWF0aGVyLCBzb3dpbmcsIGhhcnZlc3QsICNFRGF5LHBsYW50RGVuc2l0eSwgQ3JvcFBhcmFtcykNCiMgICAgbm4gPC0gbnJvdyhyZXMpDQojICAgIG8xW2ksIGpdIDwtIGFzLmNoYXJhY3RlcihyZXMkZGF0ZVsxXSkNCiMgICAgbzJbaSwgal0gPC0gcm91bmQocmVzJGZ0eVtubl0sIDEpDQojICAgIG8zW2ksIGpdIDwtIHJvdW5kKHJlcyR0ZG1bbm5dLCAxKQ0KIyAgICANCiMgIH0NCiN9DQojDQojYzEgPC0gbGlzdChkYXRlID0gbzEsIGZ0eSA9IG8yLCB0ZG0gPSBvMykNCiMNCiMNCiMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMjIDkuIEZpbmFsIHBsb3QNCiMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMjIGdlbmVyYWwgcGxvdCBzZXR0aW5ncw0KI3BhcihvbWEgICAgPSBjKDMuMCwgNC4yLCAyLjAsIDQuMiksICAjIGdlbmVyYWwgbWFyZ2lucw0KIyAgICBtZnJvdyAgPSBjKDEsIDIpLCAgICAgICAgICAgICAgICAjIG51bWJlciBvZiAjc3ViLWZpZ3VyZXMNCiMgICAgbWFyICAgID0gYygwLjgsIDAuMSwgMC4xLCAwLjEpLCAgIyBtYXJnaW5zIHBlciAjc3ViLWZpZ3VyZQ0KIyAgICBwcyAgICAgPSAxMCwgICAgICAgICAgICAgICAgICAgICAjIHRleHQgZm9udCBzaXplDQojICAgIGZhbWlseSA9ICJzZXJpZiIsICAgICAgICAgICAgICAgICMgdGV4dCBmYW1pbHkNCiMgICAgbHdkICAgID0gMS4wLCAgICAgICAgICAgICAgICAgICAgIyBsaW5lIHdpZHRoDQojICAgIGxhcyAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICMgc3R5bGUgb2YgYXhpcyAjbGFiZWxzICANCiMgICAgcGNoICAgID0gMjAgICAgICAgICAgICAgICAgICAgICAgIyBwbG90dGluZyBwb2ludHMNCiMpDQojDQojeFQgPC0gYygxMCwgMjUsIDQwLCA1NSwgNzEsIDg2KQ0KI3hMIDwtIGMoIjEwLU5vdiIsICIyNS1Ob3YiLCAiMTAtRGVjIiwgIjI1LURlYyIsICMiMTAtSmFuIiwgIjI1LUphbiIpDQojDQojIyBzdWItZmlndXJlIEENCiNiMSA9IGJveHBsb3QoYzEkZnR5WywgMToyXSwgeGxpbSA9IGMoMC41LDQuNyksIHlsaW0gPSAjYygyOCwgNDcpLCANCiMgICAgICAgICAgICAgYXQgPSAxOjIsIGF4ZXMgPSBGQUxTRSwgYm94d2V4ID0gMC42KQ0KI2IyID0gYm94cGxvdChjMSRmdHlbLCAzOjRdLCBhZGQgPSBUUlVFLCBhdCA9IGMoMy4yLCAjNC4yKSwgDQojICAgICAgICAgICAgIGF4ZXMgPSBGQUxTRSwgYm94d2V4ID0gMC42KQ0KI2JveCgpDQojYXhpcyhzaWRlID0gMikNCiNtdGV4dChzaWRlID0gMiwgdGV4dCA9IGJxdW90ZSgiWVAgKHQgaGEiXnstMX0qIikiKSwgI2xhcyA9IDAsIA0KIyAgICAgIGxpbmUgPSAyLjQsIGNleCA9IDEuMikNCiN0ZXh0KHggPSAwLjUrMC4wMjUqKDQuNy0wLjUpLCB5ID0gNDctMC4wNTAqKDQ3LTI4KSwgDQojICAgICBsYWJlbHMgPSBicXVvdGUoYm9sZCgiQSkiKSkpDQojDQojYXhpcyhzaWRlID0gMSwgYXQgPSBjKDEsMiwzLjIsNC4yKSwgDQojICAgICBsYWJlbHMgPSBjKCJaVF9CQTcyIiwgIkNUX0JBNzIiLCAiWlRfQkE3OCIsICMiQ1RfQkE3OCIpLCBjZXguYXhpcyA9IDEuMikNCiMNCiMNCiMjIHN1Yi1maWd1cmUgQg0KI2IxID0gYm94cGxvdChjMSRmdHlbLCA1OjZdLCB4bGltID0gYygwLjUsNC43KSwgeWxpbSA9ICNjKDI4LCA0NyksIA0KIyAgICAgICAgICAgICBhdCA9IDE6MiwgYXhlcyA9IEZBTFNFLCBib3h3ZXggPSAwLjYpDQojYjIgPSBib3hwbG90KGMxJGZ0eVssIDc6OF0sIGFkZCA9IFRSVUUsIGF0ID0gYygzLjIsICM0LjIpLCANCiMgICAgICAgICAgICAgYXhlcyA9IEZBTFNFLCBib3h3ZXggPSAwLjYpDQojYm94KCkNCiNheGlzKHNpZGUgPSA0KSANCiNtdGV4dChzaWRlID0gNCwgdGV4dCA9IGJxdW90ZSgiWVAgKHQgaGEiXnstMX0qIikiKSwgI2xhcyA9IDAsIA0KIyAgICAgIGxpbmUgPSAzLjAsIGNleCA9IDEuMikNCiN0ZXh0KHggPSAwLjUrMC4wMjUqKDQuNy0wLjUpLCB5ID0gNDctMC4wNTAqKDQ3LTI4KSwgDQojICAgICBsYWJlbHMgPSBicXVvdGUoYm9sZCgiQikiKSkpDQojDQojYXhpcyhzaWRlID0gMSwgYXQgPSBjKDEsMiwzLjIsNC4yKSwgDQojICAgICBsYWJlbHMgPSBjKCJaVF9CQTcyIiwgIkNUX0JBNzIiLCAiWlRfQkE3OCIsICMiQ1RfQkE3OCIpLCBjZXguYXhpcyA9IDEuMikNCg0KDQoNCg0KDQoNCg0KYGBgDQoNCg0KDQojIyBTdXJ2ZXkgZGF0YSBjb2xsZWN0aW9uDQoNCmBgYHtyfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgMy4gVGhlcm1hbCB0aW1lIGNvbXB1dGluZw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KI3llYXIwID0gMjAwMA0KI3llYXIxID0gMjAyMg0KI24gPC0gYXMuRGF0ZSgiMjAyMy0wMS0zMSIpLWFzLkRhdGUoIjIwMjItMTEtMDEiKSsxDQojbSA8LSB5ZWFyMS15ZWFyMCsxDQojDQojI3dkYXRhIDwtIHdkYXRhW3dkYXRhJFlFQVI+PXllYXIwICYgI3dkYXRhJFlFQVI8PXllYXIxLF0NCiMNCiNvdXQwIDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSBuLCBuY29sID0gbSkpDQojb3V0MSA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbiwgbmNvbCA9IG0pKQ0KI291dDIgPC0gYXMuZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IG4sIG5jb2wgPSBtKSkNCiN5eSA9IHNlcSh5ZWFyMCwgeWVhcjEsIGJ5ID0gMSkNCiMNCiMjIGxvYWQgZXh0cmEgZnVuY3Rpb25zDQojDQojDQojDQojDQojd2VhdGhlciA8LSB3ZGF0YQ0KIw0KIyNmb3IoamogaW4gMTptKXsNCiMjICANCiMjICBkYXRlMCA9IGFzLkRhdGUocGFzdGUwKHl5W2pqXSwgIi0xMS0wMSIpKS0xDQojIyAgDQojIyAgZm9yKGlpIGluIDE6bil7DQojIyAgDQojIyAgICANCiMjICAgIHNEYXRlID0gYXMuRGF0ZShkYXRlMCArIGlpKQ0KIyMgICAgc0RhdGUubmFtZSA9IHBhc3RlKG1vbnRoKHNEYXRlKSwgZGF5KHNEYXRlKSwgc2VwICM9ICItIikNCiMjICAgIG91dDBbaWksIGpqXSA9IGFzLmNoYXJhY3RlcihzRGF0ZSkNCiMjICAgIA0KIyMgICAgc293aW5nID0gc0RhdGUNCiMjICAgIGhhcnZlc3QgPSBzb3dpbmcgKyA5MA0KIyMgICAgbmRheXMgPSBhcy5udW1lcmljKGhhcnZlc3Qtc293aW5nKSsxDQojIyAgICANCiMjIyMgdmFyaWV0eSBCYXJpIEFsdSA3MiAgICANCiMjICAgIHNvdXJjZSgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2puaW5hbnkjYS9SYW1pcmV6LWV0LWEjbC0yMDI0L21haW4vc29sYW51bVIvQkFSSS1BbHUtNzIuUiIpDQojIyAgICBzb3VyY2UoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qbmluYW55I2EvUmFtaXJlei1ldC1hI2wtMjAyNC9tYWluL3NvbGFudW1SL01vZHVsZV9Qb3RlbnRpYWxHciNvd3RoX1YyLjAuUiIpDQojIyAgICANCiMjICAgIG91dDFbaWksIGpqXSA9IGlmZWxzZShkZiRmdHlbbmRheXNdPjIwLCAjZGYkZnR5W25kYXlzXSwgTkEpDQojIyAgICANCiMjIyMgdmFyaWV0eSBCYXJpIEFsdSA3OA0KIyMgICAgc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vam5pbmFueSNhL1JhbWlyZXotZXQtYSNsLTIwMjQvbWFpbi9zb2xhbnVtUi9CQVJJLUFsdS03OC5SIikNCiMjICAgIHNvdXJjZSgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2puaW5hbnkjYS9SYW1pcmV6LWV0LWEjbC0yMDI0L21haW4vc29sYW51bVIvTW9kdWxlX1BvdGVudGlhbEdyI293dGhfVjIuMC5SIikNCiMjICAgIA0KIyMgICAgb3V0MltpaSwgampdID0gaWZlbHNlKGRmJGZ0eVtuZGF5c10+MjAsICNkZiRmdHlbbmRheXNdLCBOQSkNCiMjICAgIA0KIyMgICAgcm93bmFtZXMob3V0MClbaWldID0gc0RhdGUubmFtZQ0KIyMgICAgcm93bmFtZXMob3V0MSlbaWldID0gc0RhdGUubmFtZQ0KIyMgICAgcm93bmFtZXMob3V0MilbaWldID0gc0RhdGUubmFtZQ0KIyMgIH0NCiMjICANCiMjICBjb2xuYW1lcyhvdXQwKVtqal0gPSB5eVtqal0NCiMjICBjb2xuYW1lcyhvdXQxKVtqal0gPSB5eVtqal0NCiMjICBjb2xuYW1lcyhvdXQyKVtqal0gPSB5eVtqal0NCiMjICANCiMjfQ0KIw0KIyNkMSA8LSBvdXQxDQojI2QyIDwtIG91dDINCiMjDQojI2JveHBsb3QodChkMSksIGNvbCA9ICJncmVlbiIsIG91dGxpbmUgPSBGQUxTRSwgbGFzPTEsDQojIyAgICAgICAgeWxhYiA9ICJwb3RlbnRpYWwgeWllbGQgKHQvaGEpIikNCiMjDQojI2JveHBsb3QodChkMiksIGNvbCA9ICJyZWQiLCBvdXRsaW5lID0gRkFMU0UsIGxhcz0xLA0KIyMgICAgICAgIHlsYWIgPSAicG90ZW50aWFsIHlpZWxkICh0L2hhKSIpDQojIw0KIyMNCiMjIyMgcGxvdCBmdHkgYnkgcGxhbnRpbmcgZGF0ZQ0KIyN4IDwtIDE6OTINCiMjZnR5X21lYW4gPC0gYXBwbHkob3V0MSwgMSwgbWVhbiwgbmEucm0gPSBUUlVFKQ0KIyNmdHlfcTEwIDwtIGFwcGx5KG91dDEsIDEsIHF1YW50aWxlLCBwcm9icyA9IDAuMTAsICNuYS5ybSA9IFRSVUUpDQojI2Z0eV9xOTAgPC0gYXBwbHkob3V0MSwgMSwgcXVhbnRpbGUsIHByb2JzID0gMC45MCwgI25hLnJtID0gVFJVRSkNCiMjDQojIw0KIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIyMjIyBHZW5lcmFsIGZpZ3VyZSBzZXR0aW5ncw0KIyNwYXIob21hID0gYyg0LCAxLCAwLjUsIDAuNSksICAjIGdlbmVyYWwgbWFyZ2lucw0KIyMgICAgbWZyb3cgPSBjKDIsIDEpLCAgICAgICAgICAgICAgIyBudW1iZXIgb2YgI3N1Yi1maWd1cmVzDQojIyAgICBtYXIgPSBjKDAsMywwLDApLCAgICAgICAgICAgIyBtYXJnaW5zIHBlciAjc3ViLWZpZ3VyZQ0KIyMjICAgIHBzID0gMTAsICAgICAgICAgICAgICAgICAgICAgICMgdGV4dCBmb250IHNpemUNCiMjICAgIGZhbWlseSA9ICJzZXJpZiIgICAgICAgICAgICAgICMgdGV4dCBmYW1pbHkNCiMjIyAgICBsd2QgPSAwLjUsICAgICAgICAgICAgICAgICAgICAjIGxpbmUgd2lkdGgNCiMjIyAgICBsYXMgPSAxLCAgICAgICAgICAgICAgICAgICAgICAjIHN0eWxlIG9mIGF4aXMgI2xhYmVscw0KIyMjICAgIHBjaCA9IDIwICAgICAgICAgICAgICAgICAgICAgICMgcGxvdHRpbmcgcG9pbnRzDQojIykNCiMjDQojI3g9MTo5MA0KIyN5MT1kMSRgMjAyMWBbMTo5MF0NCiMjeTI9ZDIkYDIwMjFgWzE6OTBdDQojI3Bsb3QoeCwgeTEsIHR5cGUgPSAibCIsIHhsaW0gPSBjKDEsOTIpLCB5bGltID0gI2MoMjMsNTcpLCANCiMjICAgICB4bGFiID0gIiIsIHlsYWIgPSAicG90ZW50aWFsIHlpZWxkICh0L2hhKSIsIGF4ZXMgIz0gRkFMU0UsIA0KIyMgICAgIGx3ZCA9IDIpDQojI2JveCgpDQojI2xpbmVzKHgsIHkyLCBsd2QgPSAyLCBjb2wgPSAiZ3JheTUwIikNCiMjDQojIyNheGlzKDEsIGF0ID0gYyg1LDE1LDI1LDM1LDQ1LDU1LDY2LDc2LDg2KSwgbGFzID0gMiwNCiMjIyAgICAgbGFiZWxzID0gI2MoIjUtbm92IiwiMTUtbm92IiwiMjUtbm92IiwiNS1kZWMiLCIxNS1kZWMiLCIyNS1kZWMjIiMsIjUtamFuIiwiMTUtamFuIiwiMjUtamFuIikpDQojIyNheGlzKDEsIGxhcyA9IDEsIGF0ID0gc2VxKDUsIDkwLCBieT0xMCkpDQojI2F4aXMoMiwgbGFzID0gMSwgYXQ9c2VxKDI1LDU1LGJ5PTUpKQ0KIyNhYmxpbmUodj01MCwgbHR5ID0gMiwgY29sID0gImJsdWUiKQ0KIyNhYmxpbmUodj03NCwgbHR5ID0gMiwgY29sID0gImJsdWUiKQ0KIyMNCiMjdGV4dCg0NywgNTUuNSwgIlpUIiwgY29sID0gImJsdWUiKQ0KIyN0ZXh0KDcxLCA1NS41LCAiQ1QiLCBjb2wgPSAiYmx1ZSIpDQojIw0KIyN0ZXh0KDAsIDU1LjUsIGV4cHJlc3Npb24oYm9sZCgiQSIpKSkNCiMjbXRleHQoc2lkZT0yLCB0ZXh0PWJxdW90ZSgieWllbGQgKHQgaGEiXnsiLTEifSoiKSIpLCAjY2V4ID0gMS41LCAjbGluZSA9IDIuNCkNCiMjDQojIyMjIw0KIyN4PTE6ODUNCiMjeTE9ZDEkYDIwMjJgWzE6ODVdDQojI3kyPWQyJGAyMDIyYFsxOjg1XQ0KIyNwbG90KHgsIHkxLCB0eXBlID0gImwiLCB4bGltID0gYygxLDkyKSwgeWxpbSA9ICNjKDIzLDUyKSwgDQojIyAgICAgeGxhYiA9ICIiLCB5bGFiID0gInBvdGVudGlhbCB5aWVsZCAodC9oYSkiLCBheGVzICM9IEZBTFNFLCANCiMjICAgICBsd2QgPSAyKQ0KIyNib3goKQ0KIyNsaW5lcyh4LCB5MiwgbHdkID0gMiwgY29sID0gImdyYXk1MCIpDQojIw0KIyNheGlzKDEsIGF0ID0gYyg1LDE1LDI1LDM1LDQ1LDU1LDY2LDc2LDg2KSwgbGFzID0gMiwNCiMjICAgICBsYWJlbHMgPSAjYygiMDUtbm92IiwiMTUtbm92IiwiMjUtbm92IiwiMDUtZGVjIiwiMTUtZGVjIiwiMjUtZGUjYyIsIjA1LWphbiIsIjE1LWphbiIsIjI1LWphbiIpKQ0KIyNheGlzKDEsIGxhcyA9IDEsIGF0ID0gc2VxKDUsIDkwLCBieT0xMCkpDQojYXhpcygyLCBsYXMgPSAxLCBhdD1zZXEoMjUsNTAsYnk9NSkpDQojYWJsaW5lKHY9NDQsIGx0eSA9IDIsIGNvbCA9ICJibHVlIikNCiNhYmxpbmUodj02MiwgbHR5ID0gMiwgY29sID0gImJsdWUiKQ0KIw0KI3RleHQoNDEsIDUxLCAiWlQiLCBjb2wgPSAiYmx1ZSIpDQojdGV4dCg1OSwgNTEsICJDVCIsIGNvbCA9ICJibHVlIikNCiMNCiN0ZXh0KDAsIDUxLCBleHByZXNzaW9uKGJvbGQoIkIiKSkpDQojDQojbXRleHQoc2lkZT0yLCB0ZXh0PWJxdW90ZSgieWllbGQgKHQgaGEiXnsiLTEifSoiKSIpLCBjZXggPSAxLjUsICNsaW5lID0gMi40KQ0KIw0KDQoNCg0KDQoNCg0KDQoNCg0KYGBgDQoNCiMjIFN0b2NoYXN0aWMgRnJvbnRpZXIgQW5hbHlzaXMNCg0KDQojIyBSZWZlcmVuY2VzDQoNCjEuIFtIYXJhaGFnYXp3ZSBldCBhbC4gKDIwMTgpXSgjSGFyYWhhZ2F6d2UtZXQtYWwtMjAxOCkNCg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyBLbml0IGluZGV4LlJtZCB0d28gdGltZXMNCmZpbGUuY29weShmcm9tID0gIi4vaW5kZXguaHRtbCIsIHRvID0gIi4uL2RvY3MvIiwgb3ZlcndyaXRlID0gVFJVRSkgICAgICAgICAgICANCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg==